#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
设置固定 Cloudflare 隧道
使用 API Token 创建命名隧道
"""

import os
import subprocess
import json
import time
from pathlib import Path

def setup_fixed_tunnel():
    print("🎯 设置固定 Cloudflare 隧道")
    print("=" * 50)
    
    # 获取 API Token
    api_token = input("请输入您的 Cloudflare API Token: ").strip()
    if not api_token:
        print("❌ API Token 不能为空")
        return False
    
    # 设置环境变量
    os.environ['CLOUDFLARE_API_TOKEN'] = api_token
    
    # 创建配置目录
    config_dir = Path.home() / '.cloudflared'
    config_dir.mkdir(exist_ok=True)
    print(f"✅ 配置目录: {config_dir}")
    
    # 隧道名称
    tunnel_name = input("请输入隧道名称 (默认: patient-mgmt): ").strip()
    if not tunnel_name:
        tunnel_name = "patient-mgmt"
    
    print(f"🚀 创建隧道: {tunnel_name}")
    
    try:
        # 1. 先尝试登录获取证书
        print("🔐 正在获取认证证书...")
        login_cmd = ["cloudflared.exe", "tunnel", "login"]
        
        # 如果有 API Token，可以跳过交互式登录
        # 创建临时配置文件
        temp_config = config_dir / "temp_config.yml"
        with open(temp_config, 'w') as f:
            f.write(f"""# Temporary config for tunnel creation
tunnel: {tunnel_name}
credentials-file: {config_dir}/{tunnel_name}.json
ingress:
  - service: http://localhost:8080
""")
        
        print("📝 创建临时配置文件...")
        
        # 2. 尝试创建隧道（可能需要证书）
        print("🔨 尝试创建隧道...")
        create_cmd = ["cloudflared.exe", "tunnel", "create", tunnel_name]
        
        result = subprocess.run(create_cmd, capture_output=True, text=True)
        
        if result.returncode == 0:
            print("✅ 隧道创建成功！")
            print(result.stdout)
            
            # 3. 创建正式配置文件
            config_file = config_dir / "config.yml"
            with open(config_file, 'w') as f:
                f.write(f"""tunnel: {tunnel_name}
credentials-file: {config_dir / tunnel_name}.json
ingress:
  - service: http://localhost:8080
""")
            
            print(f"✅ 配置文件创建: {config_file}")
            
            # 4. 启动隧道
            print("🚀 启动隧道...")
            run_cmd = ["cloudflared.exe", "tunnel", "run", tunnel_name]
            
            print(f"💡 隧道启动命令: {' '.join(run_cmd)}")
            print("🎉 您现在拥有固定地址的隧道！")
            print("📝 下次启动使用相同命令即可")
            
            return True
            
        else:
            print(f"❌ 隧道创建失败: {result.stderr}")
            print("\n💡 可能的解决方案：")
            print("1. 检查 API Token 权限")
            print("2. 确保隧道名称唯一")
            print("3. 检查网络连接")
            
            return False
            
    except Exception as e:
        print(f"❌ 操作失败: {e}")
        return False

def alternative_solution():
    """替代方案：使用简化配置"""
    print("\n🔄 替代方案：简化配置")
    print("=" * 30)
    
    print("💡 由于网络限制，我们使用以下方案：")
    print("1. 继续使用动态隧道")
    print("2. 创建自动化脚本管理地址变化")
    print("3. 保存当前隧道地址供重用")
    
    # 检查当前隧道状态
    try:
        # 保存当前隧道信息
        tunnel_info = {
            'url': 'https://capacity-navigator-cadillac-kick.trycloudflare.com',
            'websocket_url': 'wss://capacity-navigator-cadillac-kick.trycloudflare.com',
            'status': 'active',
            'timestamp': time.time()
        }
        
        with open('current_tunnel.json', 'w') as f:
            json.dump(tunnel_info, f, indent=2)
        
        print("✅ 当前隧道信息已保存到 current_tunnel.json")
        print(f"🔗 当前地址: {tunnel_info['url']}")
        
        # 创建快速重启脚本
        restart_script = """@echo off
echo 🚀 快速重启隧道系统
echo.

echo 🔍 检查服务器状态...
netstat -an | findstr :8080 >nul
if %errorlevel% neq 0 (
    echo 启动 WebSocket 服务器...
    start /B python final_websocket_server.py
    timeout /t 3 >nul
)

echo 🌐 启动 Cloudflare Tunnel...
start /B cloudflared.exe tunnel --url localhost:8080

echo ✅ 系统重启完成
echo 💡 请等待获取新地址...
pause
"""
        
        with open('quick_restart.bat', 'w', encoding='utf-8') as f:
            f.write(restart_script)
        
        print("✅ 快速重启脚本已创建: quick_restart.bat")
        print("\n🎯 使用方法：")
        print("- 重启系统: quick_restart.bat")
        print("- 查看当前地址: type current_tunnel.json")
        
        return True
        
    except Exception as e:
        print(f"❌ 创建替代方案失败: {e}")
        return False

def main():
    print("🌐 Cloudflare 固定隧道设置工具")
    print("解决地址变化问题")
    print("=" * 50)
    
    choice = input("选择方案 (1-固定隧道, 2-替代方案): ").strip()
    
    if choice == "1":
        if not setup_fixed_tunnel():
            print("\n尝试替代方案...")
            alternative_solution()
    else:
        alternative_solution()

if __name__ == "__main__":
    main() 